const fs = require("fs");
const images = require("images");
const nodeXlsx = require("node-xlsx"); //引用node-xlsx模块
const qr = require("qr-image-color");

const qr_wh = 360; // 二维码宽高
const qr_bg_wh = 480; // 二维码背景宽高
const qr_logo_wh = 80; // 二维码中间logo宽高

const idx_pid = 13; // 产品编号在excel中的索引
const idx_cid = 4; // 区块链编号在excel中的索引

// 遍历获取所有的excel文件
let excels = [];
const dir = fs.readdirSync("./excel");
for (let file of dir) {
  if (file.indexOf("xls") !== -1 || file.indexOf("xlsx") !== -1) {
    const filename = file.split(".")[0];
    const filepath = `${__dirname}/excel/${file}`;
    // 读取excel表格
    let sheets = nodeXlsx.parse(filepath);
    // 取出excel文件中的第一个工作表中的全部数据
    let rows = sheets[0].data;
    // 一般来说表中的第一条数据可能是标题没有用，所以删掉
    rows.splice(0, 1);
    // 获取到该excel中所有的产品id
    let datas = rows.map((item) => {
      return {
        pid: item[idx_pid],
        cid: item[idx_cid],
      };
    });
    excels.push({
      name: filename,
      path: filepath,
      datas: datas,
    });
  }
}
console.log("表格文件", JSON.stringify(excels, null, 2));

// 创建二维码
function createQRCode(dirPath, pid, cid) {
  // 跳转地址
  const url = `http://120.77.246.19:8904/?pid=${pid}&cid=${cid}`;

  // 获取二维码数据流
  let qr_buffer = qr.imageSync(url, {
    ec_level: "M",
    type: "png",
    size: 5,
    margin: 0,
    color: "#2db7ff",
    transparent: true,
  });

  // 图片合成
  const qr_bg_path = `${__dirname}/assets/qr-bg.jpeg`; // 二维码背景路径
  const qr_logo_path = `${__dirname}/assets/logo.png`; // 二维码中间logo路径
  const qr_save_path = `${dirPath}/${pid}_${cid}.png`; // 二维码保存路径
  const qr_xy = (qr_bg_wh - qr_wh) / 2; // 二维码的坐标
  const qr_logo_xy = (qr_bg_wh - qr_logo_wh) / 2; // 二维码中间logo的坐标
  images(qr_bg_path)
    .resize(qr_bg_wh, qr_bg_wh) // 等比裁剪
    .draw(images(Buffer.from(qr_buffer)).resize(qr_wh, qr_wh), qr_xy, qr_xy) // 合成
    .draw(images(qr_logo_path).resize(qr_logo_wh, qr_logo_wh), qr_logo_xy, qr_logo_xy) // 合成
    .save(qr_save_path, { quality: 50 }); // 保存

  console.log("生成二维码 >  pid=%o, cid=%o", pid, cid);
}

for (const excel of excels) {
  // 二维码保存路径需要根据excel文件名称来，这样比较容易区分
  const dir = `${__dirname}/qr/${excel.name}`;
  if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
  for (const item of excel.datas) {
    createQRCode(dir, item.pid, item.cid);
  }
}
